print("异步IO##################################################start")
import asyncio, threading


@asyncio.coroutine  # @asyncio.coroutine把一个generator标记为coroutine类型，
# 然后，我们就把这个coroutine扔到EventLoop中执行
def hello():
    print('Hello world! (%s)' % threading.currentThread())
    # 异步调用asyncio.sleep(5):
    r = yield from asyncio.sleep(5)  # asyncio.sleep(5)模拟成耗时5秒的IO操作
    print('Hello again! (%s)' % threading.currentThread())


# 获取EventLoop:
loop = asyncio.get_event_loop()
tasks = [hello(), hello()]
# 执行coroutine
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
# 由打印的当前线程名称可以看出，两个coroutine是由同一个线程并发执行的
# 如果把asyncio.sleep()换成真正的IO操作，则多个coroutine就可以由一个线程并发执行
print("异步IO##################################################end\n")
